/*
 * parser.c
 *
 *  Created on: 7 avr. 2013
 *
 *      Author: Jourdain Pierre <pierre80@voila.fr>
 *      XML parser for retrieving posts from a file
 *      License : GPLV3
 */

/*Define standard headers*/
#include <stdbool.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
/*For string usage*/
#include <string.h>
#include <stdarg.h>
#include <errno.h>
#include <time.h>
/*Include prototype of functions*/
#include "parser.h"
//Variables globales
int nombre_de_passages=0;//Compte le nombre de passages

//TODO http://www.andreypudov.com/2012/07/xml-parser-in-c-usage-and-examples.html
/*Structure message */
/*Cette structure permet de stocker les messages avant affichage ,elle sera vidé après chaque printf*/
struct message{
	char *login;//Login de la personne
	char *message;//Message contenu
	char *time;//Heure (toujours positif)
	char *id;//Id de post
	char *info;//UA

};
struct site{
	char *site;
	char *timezone;//Pour la timezone
	char *xml_version;
}site;
#define MATCH(dest,buf,srch) do {(dest) = strstr(buf, (srch));if (NULL == (dest))return -1;	} while (0)		\


//Cette fonction est un parser "dégueulasse" qui utilise un systeme de comparaison de chaine dans le but
//de séléctionner les informations a afficher sur le terminal en sortie Cette fonction accepte comme donnée d'entrée
//un pointeur sur fichier pour que cela fonctionne il faut déjà ouvrir le fichier récupéré par le client http du soft
// et renvoie une valeur numérique selon l'état du traitement
char* matching_value(char *value,char *xml_value)
{
	char *valret="NULL";

	char *end="";



	if(strstr(value,"<?xml version=")&&(strstr(value,"encoding="))!=NULL)//Détection de <?xml version="1.0" encoding="UTF-8"?>
	{
		//On fait rien
		return valret="NULL";
	}
	else if(strstr(value,xml_value))
	{
		valret=strchr(value,'>');
		valret++;
		end=strstr(value,"<");
		end="\0";
	}
	return valret;
}
int decode_xml_content(FILE *filename,int num_site)
{

	Message mes[256];//256 posts
	Site website[100];
	int state=0;//Permet de connaitre l'état de la fonction
	char *start="";
	char *end="";
	//Début de l'arbre xml
	char *xml_version="<?xml version=";
	char *encoding="encoding=\"";
	char *time_zone="timezone=";//Décalage horaire
	char *board_site="<board site=\"";//Nom du site
	char *message_time="<post time=\"";//Heure du post
	char *post_id="id=";//Id du post (pour checker si changement du post)
	char *useragent="<info>";//Affiche l'user agent
	char *message="<message>";//Le contenu du post
	char *line="",*ptr_line,*ptr_line_tmp;
	int nombre_de_lignes=0;
	int lenght_post=0;
	//On lis le fichier ligne par ligne
	while(!feof(filename))//Tq pas fin de fichier
	{
		printf("Debug : Ouverture du fichier ok");
		//Compte le nombre de lignes
		while(fgets(line,sizeof line,filename)!=NULL&&nombre_de_passages<=256)//Récupere la ligne
		{
			//Détection de xml version et de encoding
			int z=0;
			while(nombre_de_passages<256)
			{
				if((ptr_line=matching_value(line,message)!="NULL"))
				{
				mes[nombre_de_passages].message=ptr_line;
				state=9;
				}
				if((ptr_line=matching_value(line,post_id)!="NULL"))
				{
				mes[nombre_de_passages].id=ptr_line;
				state=8;
				}
				if((ptr_line=matching_value(line,useragent)!="NULL"))
				{
				mes[nombre_de_passages].info=ptr_line;
				state=7;
				}
				if((ptr_line=matching_value(line,message)!="NULL"))
				{
				mes[nombre_de_passages].message=ptr_line;
				state=6;
				}
				if((ptr_line=matching_value(line,message_time)!="NULL"))
				{
					mes[nombre_de_passages].message=ptr_line;
				}
				else
				{
					state=0;
				}
				nombre_de_lignes++;/*On ajoute 1 à chaque fois*/
				nombre_de_passages++;
			}



			}/*Fin de fic*/
		}
		return state;
	}
	//Cette fonction affiche tous les posts stockés dans les structures
	void afficher_posts(void)
	{
		Message mes[256];//256 posts
		Site website[512];
		//Boucle qui lit toutes les structures
		int i=0;
		for(i=0;i<=nombre_de_passages;i++)
		{
			//Affiche le contenu de la struct numero i
			printf("%d %s %s %s %s\n",i,mes[i].time,mes[i].login,mes[i].info,mes[i].message);
		}

	}
